/**
在 TypeScript 中，交叉类型（Intersection Types）是一种用于将多个类型合并为一个类型的功能。交叉类型允许你将多个类型的特性组合在一起，从而创建一个具有所有这些特性的类型。
  1. 基本概念
  交叉类型使用  `&`  符号来定义，表示一个类型同时具有多个类型的特性。它通常用于组合对象类型，使得新类型包含所有被组合类型的属性。

  2. 语法示例

   定义交叉类型
  type Person = {
    name: string;
    age: number;
  };

  type Employee = {
    employeeId: number;
    department: string;
  };

  // 创建一个交叉类型
  type EmployeeDetails = Person & Employee;

  const employee: EmployeeDetails = {
    name: "Alice",
    age: 30,
    employeeId: 123,
    department: "Engineering",
  };
  在这个例子中， `EmployeeDetails`  类型结合了  `Person`  和  `Employee`  的所有属性。

  3. 使用场景

  - 组合多个类型：当你需要一个对象同时具有多个类型的属性时，可以使用交叉类型。
  - 增强类型的灵活性：交叉类型可以用于增强类型的灵活性，特别是在处理复杂数据结构时。

  4. 注意事项

  - 属性冲突：如果被组合的类型中有相同名称的属性，交叉类型将要求这些属性的类型必须一致，否则会导致类型错误。
  type A = { name: string; age: number };
  type B = { name: string; salary: number };

  // 下面的交叉类型会报错，因为 name 属性的类型不一致
  // type C = A & B; // Error: Type 'string' is not assignable to type 'number'.
  5. 总结

  交叉类型是 TypeScript 中一个非常强大的特性，允许开发者将多个类型合并为一个类型，从而创建出更复杂和灵活的类型结构。它适用于需要组合多个对象特性、增强类型灵活性和处理复杂数据结构的场景。在使用交叉类型时，需要注意属性的冲突问题，以确保类型的一致性。
 */
// 交叉类型: 两种(多种)类型要同时满足
type NewType  = string & number // 没有意义

interface Person {
  name: string;
  age: number;
}

interface Student {
  sno: number;
  runing: () => void;
}

type PersonStudent = Person & Student;

const personStudent: PersonStudent = {
  name: "Intersection-type-name",
  age: 18,
  sno: 111,
  runing: function() {
    console.log("running~");
  }
}